![](/img/trans.png)
[英]Java: send POST HTTP request to upload a file to MediaFire REST API
[英]Send JSON data in an HTTP GET request to a REST API from JAVA code
我正在向我的 API 成功發出以下 curl 請求:
curl -v -X GET -H "Content-Type: application/json" -d {'"query":"some text","mode":"0"'} http://host.domain.abc.com:23423/api/start-trial-api/
我想知道如何從 JAVA 代碼內部發出此請求。 我嘗試通過 Google 和堆棧溢出搜索解決方案。 我所發現的只是如何通過查詢字符串發送數據或如何通過 POST 請求發送 JSON 數據。
謝謝
使用下面的代碼,您應該能夠調用任何 rest API。
創建一個名為 RestClient.java 的類,它將具有獲取和發布的方法
package test;
import java.io.IOException;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import com.javamad.utils.JsonUtils;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
public class RestClient {
public static <T> T post(String url,T data,T t){
try {
Client client = Client.create();
WebResource webResource = client.resource(url);
ClientResponse response = webResource.type("application/json").post(ClientResponse.class, JsonUtils.javaToJson(data));
if (response.getStatus() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ response.getStatus());
}
String output = response.getEntity(String.class);
System.out.println("Response===post="+output);
t=(T)JsonUtils.jsonToJavaObject(output, t.getClass());
} catch (JsonParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return t;
}
public static <T> T get(String url,T t)
{
try {
Client client = Client.create();
WebResource webResource = client.resource(url);
ClientResponse response = webResource.accept("application/json").get(ClientResponse.class);
if (response.getStatus() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ response.getStatus());
}
String output = response.getEntity(String.class);
System.out.println("Response===get="+output);
t=(T)JsonUtils.jsonToJavaObject(output, t.getClass());
} catch (JsonParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return t;
}
}
調用 get 和 post 方法
public class QuestionAnswerService {
static String baseUrl="http://javamad.com/javamad-webservices-1.0";
//final String baseUrl="http://javamad.com/javamad-webservices-1.0";
@Test
public void getQuestions(){
System.out.println("javamad.baseurl="+baseUrl);
GetQuestionResponse gqResponse=new GetQuestionResponse();
gqResponse =RestClient.get(baseUrl+"/v1/questionAnswerService/getQuestions?questionType=2",gqResponse);
List qList=new ArrayList<QuestionDetails>();
qList=(List) gqResponse.getQuestionList();
//System.out.println(gqResponse);
}
public void postQuestions(){
PostQuestionResponse pqResponse=new PostQuestionResponse();
PostQuestionRequest pqRequest=new PostQuestionRequest();
pqRequest.setQuestion("maybe working");
pqRequest.setQuestionType("2");
pqRequest.setUser_id("2");
//Map m= new HashMap();
pqResponse =(PostQuestionResponse) RestClient.post(baseUrl+"/v1/questionAnswerService/postQuestion",pqRequest,pqResponse);
}
}
制作自己的請求和響應類。
對於 json 到 java 和 java 到 json 使用下面的類
package com.javamad.utils;
import java.io.IOException;
import org.apache.log4j.Logger;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
public class JsonUtils {
private static Logger logger = Logger.getLogger(JsonUtils.class.getName());
public static <T> T jsonToJavaObject(String jsonRequest, Class<T> valueType)
throws JsonParseException, JsonMappingException, IOException {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(org.codehaus.jackson.map.DeserializationConfig.Feature.UNWRAP_ROOT_VALUE,false);
T finalJavaRequest = objectMapper.readValue(jsonRequest, valueType);
return finalJavaRequest;
}
public static String javaToJson(Object o) {
String jsonString = null;
try {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(org.codehaus.jackson.map.DeserializationConfig.Feature.UNWRAP_ROOT_VALUE,true);
jsonString = objectMapper.writeValueAsString(o);
} catch (JsonGenerationException e) {
logger.error(e);
} catch (JsonMappingException e) {
logger.error(e);
} catch (IOException e) {
logger.error(e);
}
return jsonString;
}
}
我編寫了 RestClient.java 類,以重用 get 和 post 方法。 同樣,您可以編寫其他方法,例如放置和刪除...
希望它會幫助你。
您可以使用 Jersey 客戶端庫,如果您的項目是 Maven,則只需在 pom.xml 中包含來自 com.sun.jersey 組 ID 的 jersey-client 和 jersey-json 工件。 要連接到 Web 服務,您需要一個WebResource對象:
WebResource 資源 = ClientHelper.createClient().resource(UriBuilder.fromUri(" http://host.domain.abc.com:23423/api/ ").build());
要進行發送有效載荷的呼叫,您可以將有效載荷建模為 POJO,即
class Payload {
private String query;
private int mode;
... get and set methods
}
然后使用資源對象調用調用:
Payload payload = new Payload();
payload.setQuery("some text"); payload.setMode(0);
ResultType result = service
.path("start-trial-api").
.type(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.get(ResultType.class, payload);
其中 ResultType 是被調用服務的 Java 映射返回類型,以防它是 JSON 對象,否則您可以刪除接受調用並將 String.class 作為獲取參數並將返回值分配給普通字符串。
Spring 的 RESTTemplate 也可用於發送所有 REST 請求,即 GET 、 PUT 、 POST 、 DELETE
通過使用Spring REST 模板,您可以使用 POST 傳遞 JSON 請求,如下所示,
您可以使用 JSON 序列化程序(例如 jackson)將序列化為 java Object 的 JSON 表示傳遞
RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> list = new ArrayList<HttpMessageConverter<?>>();
list.add(new MappingJacksonHttpMessageConverter());
restTemplate.setMessageConverters(list);
Person person = new Person();
String url = "http://localhost:8080/add";
HttpEntity<Person> entity = new HttpEntity<Person>(person);
// Call to Restful web services with person serialized as object using jackson
ResponseEntity<Person> response = restTemplate.postForEntity( url, entity, Person.class);
Person person = response.getBody();
在同一個問題上gson
掙扎,並使用gson
找到了一個不錯的解決方案。
編碼:
// this method is based on gson (see below) and is used to parse Strings to json objects
public static JsonParser jsonParser = new JsonParser();
public static void getJsonFromAPI() {
// the protocol is important
String urlString = "http://localhost:8082/v1.0/Datastreams"
StringBuilder result = new StringBuilder();
try {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line; // reading the lines into the result
while ((line = rd.readLine()) != null) {
result.append(line);
}
rd.close();
// parse the String to a jsonElement
JsonElement jsonObject = jsonParser.parse(result.toString());
System.out.println(jsonObject.getAsJsonObject() // object is a mapping
.get("value").getAsJsonArray() // value is an array
.get(3).getAsJsonObject() // the fourth item is a mapping
.get("name").getAsString()); // name is a String
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
包:
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Properties;
我的pom.xml
:
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
我希望這可以幫助你!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.