为了账号安全,请及时绑定邮箱和手机立即绑定

在 java 中使用 HttpURLConnection 发送带有 GET 请求的请求体

在 java 中使用 HttpURLConnection 发送带有 GET 请求的请求体

MMTTMM 2023-04-13 10:45:29
请不要将我的问题与使用 HttpURLConnection 发送带有 POST 请求的正文混淆。我想使用 HttpURLConnection 发送带有 GET 请求的正文。这是我正在使用的代码。public static String makeGETRequest(String endpoint, String encodedBody) {    String responseJSON = null;    URL url;    HttpURLConnection connection;    try {        url = new URL(endpoint);        connection = (HttpURLConnection) url.openConnection();        connection.setInstanceFollowRedirects(true);        connection.setDoOutput(true);        connection.setRequestMethod("GET");        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");        connection.connect();        OutputStream outputStream = connection.getOutputStream();        outputStream.write(encodedBody.getBytes());        outputStream.flush();        Util.log(connection,connection.getResponseCode()+":"+connection.getRequestMethod());        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));        String responseChunk = null;        responseJSON = "";        while ((responseChunk = bufferedReader.readLine()) != null) {            responseJSON += responseChunk;        }        bufferedReader.close();        connection.disconnect();    } catch (Exception e) {        e.printStackTrace();        Util.log(e, e.getMessage());    }    return responseJSON;}实际情况是根据 connection.getInputStream()和connection.getOutPutStream() 自动识别请求类型。当您调用connection.getOutPutStream()时,请求类型会自动设置为POST,即使您已使用connection.setRequestMethod("GET")将请求类型明确设置为GET。问题是我正在使用第 3 方 Web 服务 (API),它接受请求参数作为 GET 请求的正文<get-request>/myAPIEndPointbody = parameter1=value as application/x-www-form-urlencoded<response>{json}我很清楚大多数情况下 GET 没有请求主体,但许多 Web 服务经常使用带有参数的 GET 请求作为主体而不是查询字符串。请指导我如何在不使用任何第 3 方库(OkHttp、Retrofit、Glide 等)的情况下在 android 中发送带正文的 GET 请求
查看完整描述

1 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

使用这段代码你需要做一些修改,但它会完成工作。


package com.kundan.test;


import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.net.Socket;


public class GetWithBody {


    public static final String TYPE = "GET ";

    public static final String HTTP_VERSION = " HTTP/1.1";

    public static final String LINE_END = "\r\n";


    public static void main(String[] args) throws Exception {

        Socket socket = new Socket("localhost", 8080); // hostname and port default is 80

        OutputStream outputStream = socket.getOutputStream();

        outputStream.write((TYPE + "<Resource Address>" + HTTP_VERSION + LINE_END).getBytes());// 

        outputStream.write(("User-Agent: Java Socket" + LINE_END).getBytes());

        outputStream.write(("Content-Type: application/x-www-form-urlencoded" + LINE_END).getBytes());

        outputStream.write(LINE_END.getBytes()); //end of headers

        outputStream.write(("parameter1=value&parameter2=value2" + LINE_END).getBytes()); //body 

        outputStream.flush();


        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        StringBuilder builder = new StringBuilder();

        String read = null;

        while ((read = bufferedReader.readLine()) != null) {

            builder.append(read);

        }


        String result = builder.toString();

        System.out.println(result);

    }

}

这是原始 HTTP 请求转储


GET <Resource Address> HTTP/1.1

User-Agent: Java Socket

Content-Type: application/x-www-form-urlencoded


parameter1=value&parameter2=value2


查看完整回答
反对 回复 2023-04-13
  • 1 回答
  • 0 关注
  • 339 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信